Nachtrag zum MUI-Kurs in AmZeiger 12/97

von
Thomas Heinrich

Carsten Jahn:
Der Anfang des Kurses (s. letzte Ausgabe) beschäftigte sich damit, die MUI-Includes und einen Beispiel-Quelltext überhaupt mit MaxonC++ in Einklang zu bringen. Weil der Compiler kein Äquivalent zu den "tagcalls&qout; von SAS-C hat, habe ich empfohlen, Funktionen wie MUI_NewObject einfach auszukommentieren (MUI_NewObjectA geht ja).


Thomas Heinrich weiß eine bessere Lösung, und hat sie mir auch geschrieben:


Genau das gleiche Problem der MUI-Funktionen hatte ich auch (MaxonC++ 4).

Die Lösung ist ziemlich einfach, ich weiß allerdings nicht, ob es inzwischen eine bessere (mitgelieferte) gibt.

Hier meine Lösung in ANSI-C:
   #include 
   #include 
   #include 

   /**********************************************/
   /* Stub functions to be used in applications. */
   /* A call to one function invokes linkage of  */
   /* all functions !                            */
   /**********************************************/

   Object *MUI_NewObjectA      (char *classname,struct TagItem *tags);
   Object *MUI_MakeObjectA     (LONG type,ULONG *params);
   LONG    MUI_RequestA        (APTR app,APTR win,LONGBITS flags,
                                char *title,char *gadgets,char *format,
                                APTR params);
   APTR    MUI_AllocAslRequest (unsigned long reqType,
                                struct TagItem *tagList);
   BOOL    MUI_AslRequest      (APTR requester, struct TagItem *tagList);

   #pragma amicall(MUIMasterBase,0x1e,MUI_NewObjectA(a0,a1))
   #pragma amicall(MUIMasterBase,0x2a,MUI_RequestA(d0,d1,d2,a0,a1,a2,a3))
   #pragma amicall(MUIMasterBase,0x30,MUI_AllocAslRequest(d0,a0))
   #pragma amicall(MUIMasterBase,0x36,MUI_AslRequest(a0,a1))
   #pragma amicall(MUIMasterBase,0x78,MUI_MakeObjectA(d0,a0))

   Object *MUI_NewObject(char *classname, Tag tag1, ...)
   {
      return(MUI_NewObjectA(classname, (struct TagItem *) &tag1));
   }

   Object *MUI_MakeObject(LONG type, ULONG arg1, ...)
   {
      return(MUI_MakeObjectA(type, &arg1));
   }

   LONG MUI_Request(APTR app,APTR win,LONGBITS flags,char *title,
                    char *gadgets,char *format, APTR arg1, ...)
   {
      return(MUI_RequestA(app, win, flags, title, gadgets, format, &arg1));
   }

   APTR MUI_AllocAslRequestTags(unsigned long reqType, Tag tag1, ...)
   {
      return(MUI_AllocAslRequest(reqType, (struct TagItem *) &tag1));
   }

   BOOL MUI_AslRequestTags(APTR requester, Tag tag1, ...)
   {
      return(MUI_AslRequest(requester, (struct TagItem *) &tag1));
   }
Der Trick besteht nur darin, die Parameter von Stack ("Tag tag1, ...") in einen "TagItem *" zu verwandeln, und der passenden Funktion zu übergeben. Danach muss man das entstandene Objectfile nur noch bei Bedarf dazulinken."
Das Objektfile entsteht, wenn man den Text hier einfach so in den Compiler gibt und ihn compiliert.

Der Quelltext und die Objektdatei sind innerhalb des Binärarchivs verfügbar. Letztere gehört ins Libs-Verzeichnis des Compilers.


Prev Inhaltsverzeichnis Next
©`98Der AmZeiger